const express = require('express')
const router = express.Router()
const data = require('./data')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcryptjs')

// 验证JWT令牌的中间件
// authenticate 是一个中间件函数，主要用于验证请求中的 JWT（JSON Web Token）。
// 它的主要作用是确保只有经过身份验证的用户才能访问某些受保护的路由
const authenticate = (req, res, next) => {
  const token = req.header('Authorization').replace('Bearer ', '')
  // 从请求头中提取 Authorization 字段，并去掉前缀 Bearer 。
  if (!token) {
    return res
      .status(401)
      .json({ message: 'Access denied. No token provided.' })
    // 如果没有找到 JWT，返回 401 状态码和错误消息。
  }

  try {
    const decoded = jwt.verify(token, 'your_jwt_secret')
    // 使用 jwt.verify 方法验证 JWT。如果验证成功，将解码后的用户信息附加到 req.user。
    req.user = decoded
    next()
  } catch (ex) {
    res.status(400).json({ message: 'Invalid token.' })
  }
}

// 通过在每个受保护的路由处理函数前添加 authenticate 中间件，
// 确保只有持有有效 JWT 的用户才能访问这些路由。

// 获取所有学生信息
router.get('/students', authenticate, (req, res) => {
  res.json(data.students)
})
// 添加学生信息
router.post('/students', authenticate, (req, res) => {
  const { name, age } = req.body
  const newStudent = { id: Date.now(), name, age }
  data.students.push(newStudent)
  res.status(201).json(newStudent)
})
// 更新学生信息
router.put('/students/:id', authenticate, (req, res) => {
  const { id } = req.params
  const { name, age } = req.body
  const studentIndex = data.students.findIndex((s) => s.id.toString() === id)
  if (studentIndex === -1) {
    return res.status(404).json({ message: 'Student not found' })
  }
  data.students[studentIndex] = { ...data.students[studentIndex], name, age }
  res.json(data.students[studentIndex])
})
// 删除学生信息
router.delete('/students/:id', authenticate, (req, res) => {
  const { id } = req.params
  const studentIndex = data.students.findIndex((s) => s.id.toString() === id)
  if (studentIndex === -1) {
    return res.status(404).json({ message: 'Student not found' })
  }
  data.students.splice(studentIndex, 1)
  res.json({ message: 'Student deleted successfully' })
})

// 用户登录
router.post('/login', async (req, res) => {
  const { username, password } = req.body
  const user = data.users.find((u) => u.username === username)

  if (!user) {
    return res.status(400).json({ message: 'User not found' })
  }

  const isMatch = await bcrypt.compare(password, user.password)
  if (!isMatch) {
    return res.status(400).json({ message: 'Invalid credentials' })
  }

  const token = jwt.sign({ id: user.id }, 'your_jwt_secret', {
    expiresIn: '1h',
  })
  res.json({ token })
})

module.exports = router
